//输入框的数据合理性判断，要是0-9之间的数字才可以
function IsNumeric(sText)
{
 var ValidChars = "0123456789.";
 var IsNumber=true;
 var Char;

 for (i = 0; i < sText.length && IsNumber == true; i++) 
 { 
        //返回特定位置的字符
        Char = sText.charAt(i); 
        if (ValidChars.indexOf(Char) == -1) 
        {
          IsNumber = false;
        }
      }
      return IsNumber;

    };

//获取总价格prodSubTotal
function calcProdSubTotal() {

    //初始化总价格为0，此变量用于保存总价格
    var prodSubTotal = 0;
    //初始化每行的价格为0，此变量用于保存每行的价格
    var valString = 0;
    //var valString = $(this).val() || 0;

    //从每行的总价获取整个购物车的总价
    $(".row-total-input").each(function(){

        //进行判断复选框有没有勾上，如果前面的复选框有勾上而且状态是显示的，就要加上这行的价格
        if($(this).parent().parent().find("td.product-title input").is(":checked") && $(this).parent().parent().is(":visible"))

        {
          //勾上的话就获取这行的价格
          valString = $(this).val();

        } else {
          //没勾上的话 这行价格 当成0处理
          valString = 0;
        }

        //每行的价格都加在总价格上
        prodSubTotal += parseInt(valString);

      });
    //赋值给id为product-subtotal的元素，就是价格小计框
    $("#product-subtotal").val(prodSubTotal);

  };

//获取商品总数total-pallets-input
function calcTotalPallets() {

    //初始化商品总数为0，此变量用于保存商品总数
    var totalPallets = 0;
    //初始化每行的商品总数，此变量用于保存每行的商品总数
    var thisValue = 0;
    //从每行的商品数量input框获取每行的商品数量
    $(".num-pallets-input").each(function() {

      //进行判断复选框有没有勾上，如果前面的复选框有勾上而且状态是显示的，就加上这行的数量
      if($(this).parent().parent().find("td.product-title input").is(":checked") && $(this).parent().parent().is(":visible"))
      {
            //勾上的话就获取这行的商品数量
            thisValue = $(this).val();
          }else{
            //没勾上的话这行商品数量就当成0来处理
            thisValue = 0;
          }

        //每行的商品总数 都加在 总商品总数 上
        totalPallets += parseInt(thisValue);
        //进行简单的判断，如果符合要求才会加上去，不符合要求就...？？？？
        //不加了，失去焦点的时候就进行过判断了，而且默认所有商品都初始化为1
        // if ( (IsNumeric(thisValue)) &&  (thisValue != '') ) {};        
      });

    //赋值给id为total-pallets-input的元素，就是总数量框
    $("#total-pallets-input").val(totalPallets);

  };

//计算总运费，没用到
function calcShippingTotal() {

    //获取到的总件数
    var totalPallets = $("#total-pallets-input").val() || 0;
    //运费价格每件10元
    var shippingRate = $("#shipping-rate").text() || 0;
    //总运费=总件数 * 每件运费
    var shippingTotal = totalPallets * shippingRate;
    
    $("#shipping-subtotal").val(shippingTotal);

  };

//计算订单总额，价格+运费
function calcOrderTotal() {

  var orderTotal = 0;
    //商品价格小计
    var productSubtotal = $("#product-subtotal").val() || 0;
    //总运费
    var shippingSubtotal = $("#shipping-subtotal").val() || 0;
    
    //将字符串解析为整数
    var orderTotal = parseInt(productSubtotal) + parseInt(shippingSubtotal);
    var orderTotalNice = "$" + orderTotal;
    
    $("#order-total").val(orderTotalNice);

};


//如果一个商店下的物品全部被选中了，那么这个商店也要被选中
//如果一个商店下的物品全被被删除了，那么这个商店也要被删除
function productCheckedStore(){

      //选到所有的商店行，拿到其中的input框
  var $store = $('tr.store td.store-name input');

      //每个商店行都进行判断，看看商店下面被选中的行是不是等于商品数
      //如果被选中的行等于商品数，就把商店行给勾选上
  $store.each(function(){
        //记录这个商店下的物品个数
    var number = parseInt($(this).attr("name"));
        //用于计数，记录商店行下面有几个被选中了的
    var a = 0;
        //用于记录商店行下面有几个被删除的元素
    var b = 0;
        //从商店跳到物品前面的复选框
    var $getBrotherInput = $(this).parent().parent().nextAll('tr').find('td.product-title input');
        //现在就是要确认 商店下面被选中的行 和 商品数 的关系
        //每次需要查几次？其实只用查 这个商店下物品个数 这么多次就好了
    for(var i = 0; i < number; i++){
      //如果复选框被选中，每次记录 被选中复选框 的个数
        if($getBrotherInput[i].checked) a++;
        if($($getBrotherInput[i]).is(":hidden")) b++;
    }
        //如果被选中复选框的个数和商店下的物品个数一样的话，就将商店复选框选上
    if(a == number){
        $(this).attr("checked",true);
    }else{
        $(this).attr("checked",false);
    }
    //如果被删除的元素和商店下的物品个数数量一样，把商店也删除掉
    if(number==b){
      $(this).parent().css("display","none");
    } 
  });
}

//主函数开始
$(function(){

    //初始化商品数量，全部定为1
    //并锁定减号按钮
    $('.num-pallets-input').each(function(){
      $(this).val(1);
      $(this).parent().find('input.sub-button').attr("disabled","disabled");
    });

    //初始化每行商品总价
    $('.row-total-input').each(function(){ 
      var multiplier = $(this) .parent().parent().find("td.price-per-pallet span").text();                          
      $(this).val(multiplier);                          
    });

    //失去焦点事件
    //当每行的 数量输入框 输完之后，就执行计算每行物品价格的函数
    $('.num-pallets-input').blur(function(){

      var $this = $(this); 
        //获取每行物品的数量
        var numPallets = $this.val();
        //获取每行物品的单价
        var multiplier = $this.parent().parent().find("td.price-per-pallet span").text();

        //进行合法性判断，是数字0-9且不为空
      if ( (IsNumeric(numPallets)) && (numPallets != '') ) {

        //计算每行物品的价格 = 数量 * 单价
        var rowTotal = numPallets * multiplier;
        //将每行物品的价格赋值给每行的总计框      
        $this.parent().parent().find("td.row-total input").val(rowTotal);                     
      } else {
        alert("请输入正确的数字！");
        $this.val("1");
        //将每行物品的价格重置为单价
        $this.parent().parent().find("td.row-total input").val(multiplier);            
      };
        //前面的复选框选中时，才会更新总价格和总数量
        if($(this).parent().parent().find("td.product-title input").is(":checked"))
        {
          //总价格小计
          calcProdSubTotal();
          //商品总数
          calcTotalPallets();
          //总运费
          //calcShippingTotal();
          //总额
          calcOrderTotal();          
        }
      });

    //复选框选中更新总价函数
      $('td.product-title input').click(function(){
        // var $this = $(this);
        // //获取到内容为每行商品数量的input框
        // $input = $this
        //             .parent().parent()
        //             .find("td.num-pallets input");

        // //获取每行物品的数量
        // var numPallets = $input.val();
        // //获取每行物品的单价
        // var multiplier = $input
        //                     .parent().parent()
        //                     .find("td.price-per-pallet span")
        //                     .text();        

        // //计算每行物品的价格 = 数量 * 单价
        // var rowTotal = numPallets * multiplier;
        // //赋值给每行的总价                   
        // $input
        //     .css("background-color", "white")
        //     .parent().parent()
        //     .find("td.row-total input")
        //     .val(rowTotal);

        //如果一个商店下的物品全部被选中了，那么这个商店也要被选中
        productCheckedStore();
        //锋利的jQuery P148
        /*定义一个flag变量，默认为true,
        循环复选框，当有没被选中的项时，把变量flag的值设置为flase,
        根据flag的值来设置全选复选框是否被选中
        */
        var flag = true;
        $('td.product-title input').each(function(){
          //原生js方法
          // if(!this.checked){
          //     flag = false;
          // }
          //jQuery方法
          if(!$(this).is(":checked")){
            flag = false;    
          }
        });
        var checkAll = $(this).parent().parent().parent().find('tr td.check-all input'); 
        $(checkAll).attr('checked',flag);

        //总价格小计
        calcProdSubTotal();
        //商品总数
        calcTotalPallets();
        //总运费
        //calcShippingTotal();
        //总额
        calcOrderTotal();

      });

    //按钮控制每行商品数量减少，并实时刷新
    $('.sub-button').click(function(){

        //获取每行有商品数量的input框
        $row = $(this).parent().parent().find('.num-pallets-input');

        //锁定减号按钮，为1时就不给动了
        if(($row.val()-1)<=1){
          $(this).attr("disabled","disabled");
        }

        //取出每行商品数量的值减1
        $row.val(parseInt($row.val())-1);        

          //获取行商品单价
        $rowTotal = $(this).parent().parent().find('td.price-per-pallet span').text();

          //计算行商品总价
        var $rowSubTotal = $(this).parent().parent().find('.row-total input');
          //行商品总价 = 行商品数量 * 行商品单价                        
        $rowSubTotal.val($row.val()*$rowTotal);

          //前面的复选框选中时，才会更新总价格和总数量
          if($(this).parent().parent().find("td.product-title input").is(":checked"))
        {
          //总价格小计
          calcProdSubTotal();
          //商品总数
          calcTotalPallets();
          //总运费
          //calcShippingTotal();
          //总额
          calcOrderTotal();          
        }                       
      });

    //按钮控制每行商品数量增加，并实时刷新
    $('.add-button').click(function(){

        //获取每行有商品数量的input框
        $row = $(this).parent().parent().find('.num-pallets-input');
        //取出每行商品数量的值加1
        $row.val(parseInt($row.val())+1);
        //如果商品数量大于等于1，把减号按钮解放出来
        if($row.val()>=1){
          $(this).parent().find('input.sub-button').attr("disabled","");
        }
        
          //获取行商品单价
        $rowTotal = $(this).parent().parent().find('td.price-per-pallet span').text();

          //计算行商品总价
        var $rowSubTotal = $(this).parent().parent().find('.row-total input');
          //行商品总价 = 行商品数量 * 行商品单价                        
        $rowSubTotal.val($row.val()*$rowTotal);

          //前面的复选框选中时，才会更新总价格和总数量
        if($(this).parent().parent().find("td.product-title input").is(":checked")){
          //总价格小计
          calcProdSubTotal();
          //商品总数
          calcTotalPallets();
          //总运费
          //calcShippingTotal();
          //总额
          calcOrderTotal();          
        }                       
      });

    //点击删除按钮删除对应行函数
    $('.delete-button').click(function(){

        //使这行tr消失，看不见摸不着
        //为了方便productCheckedStore()函数的执行，被删除掉的元素前面的复选框全部默认为选定状态
        //$(this).parent().parent().remove();
        $(this).parent().parent().css('display','none');
        $(this).parent().parent().find('td.product-title input').attr("checked",true);
        
        //如果一个商店下的物品全部被选中了，那么这个商店也要被选中
        productCheckedStore();
        //删除完更新总价
          //总价格小计
          calcProdSubTotal();
          //商品总数
          calcTotalPallets();
          //总运费
          //calcShippingTotal();
          //总额
          calcOrderTotal();
    });

    //点击全选选择全部复选框函数，再次点击取消全选，都要更新价格
    $('#checkedAll').click(function(){

      $inputAll = $(this)
      .parent().parent().parent()
      .find('td input.checkbox');

      if(this.checked){
        $inputAll.attr("checked",true);
      } else {
        $inputAll.attr("checked",false);
      }

        //总价格小计
        calcProdSubTotal();
        //商品总数
        calcTotalPallets();
        //总运费
        //calcShippingTotal();
        //总额
        calcOrderTotal();

      });
    
    //删除选中商品函数
    $('#deleteCheck').click(function(){

        //获取所有复选框
        $checkInput = $(this).parent().parent().parent().find('tr td input.checkbox'); 

        //遍历查找为选定状态的复选框，然后设置display为none
        //为了方便productCheckedStore()函数的执行，被删除掉的元素前面的复选框全部默认为选定状态
        $checkInput.each(function(){
          if($(this).is(':checked')){
            //$(this).parent().parent().remove();
            $(this).parent().parent().css('display','none');
            $(this).parent().parent().find('td.product-title input').attr("checked",true);
          }
        });

        //如果把所有商品删除了，全选框跟着消失
        var i=0;
        var checkAll = $(this).parent().parent().parent().find('tr td.check-all input');
        $checkInput.each(function(){
          if($(this).is(":hidden")) i++;
        });
        if(i==$checkInput.length) $(checkAll).attr('checked',false);

        //刷新一下价格
        //总价格小计
        calcProdSubTotal();
        //商品总数
        calcTotalPallets();
        //总运费
        //calcShippingTotal();
        //总额
        calcOrderTotal();
        
      })

    //点击商店名复选框
    $('td.store-name input').click(function(){

      //获取每个商店中的货品个数
      var getNumber = parseInt($(this).attr("name"));
      //获取标明商店名这行的tr
      var $getTr = $(this).parent().parent();
      //获取这行tr之后的同辈tr
      var $getBrother = $getTr.nextAll("tr");
      //获取同辈tr的input框
      var $getBrotherInput = $getBrother.find('td.product-title input');

      if(this.checked){
      //使用循环将商店中该有的货品的勾选上
        for(var i=0;i<getNumber;i++){
        /*
        $getBrotherInput[i]这种格式会把jQuery对象转换为dom对象！！！
        因此设置属性的时候要用原生js，
        或者再转换为jQuery对象使用jQuery方法
        */
        //$getBrotherInput[i].setAttribute("checked","checked");
          $($getBrotherInput[i]).attr("checked",true);
        }
      }else{
      //使用循环将商店中勾上的货品都不选
        for(var i=0;i<getNumber;i++){
          $($getBrotherInput[i]).attr("checked",false);
        }
      }

        //锋利的jQuery P148
        /*定义一个flag变量，默认为true,
        循环复选框，当有没被选中的项时，把变量flag的值设置为flase,
        根据flag的值来设置全选复选框是否被选中
        */
        var flag = true;
        $('td.product-title input').each(function(){
          //原生js方法
          // if(!this.checked){
          //     flag = false;
          // }
          //jQuery方法
          if(!$(this).is(":checked")){
            flag = false;    
          }
        });
        var checkAll = $(this).parent().parent().parent().find('tr td.check-all input'); 
        $(checkAll).attr('checked',flag);

        // 刷新一下价格
        // 总价格小计
        calcProdSubTotal();
        //商品总数
        calcTotalPallets();
        //总运费
        //calcShippingTotal();
        //总额
        calcOrderTotal();      
      })

    
  });